package jun.svr.TestSvr;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.util.Iterator;

import jun.comm.netkit.JunProtocol;

public class TestSvr2 {

	// 监听IP地址
	private static String IP = "127.0.0.1";

	// 监听端口
	private static int PORT = 50080;
	// 缓冲区大小
	private static final int BUFFER_SIZE = 1024;

	// 超时时间，单位毫秒
	private static final int TIME_OUT = 3000;

	public static void main(String[] args) throws Exception {
		// 创建选择器
		Selector selector = Selector.open();

		// 打开监听信道
		ServerSocketChannel svrSktChan = ServerSocketChannel.open();

		// 与本地端口绑定
		svrSktChan.socket().bind(new InetSocketAddress(IP, PORT));

		// 设置为非阻塞模式
		svrSktChan.configureBlocking(false);

		// 将选择器绑定到监听信道,只有非阻塞信道才可以注册选择器.并在注册过程中指出该信道可以进行Accept操作
		svrSktChan.register(selector, SelectionKey.OP_ACCEPT);

		// 创建一个处理协议的实现类,由它来具体操作
		JunProtocol junProtocol = new JunProtocol(BUFFER_SIZE);
		System.out.println("TestSvr服务启动成功，端口:" + PORT);
		
//		while (true) {
//			// 等待某信道就绪(或超时)
//			if (selector.select(TIME_OUT) == 0) {
////				System.out.print("独自等待.");
//				continue;
//			}
//
//			// 取得迭代器.selectedKeys()中包含了每个准备好某一I/O操作的信道的SelectionKey
//			Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
//
//			while (keyIter.hasNext()) {
//				SelectionKey key = keyIter.next();
//
//				try {
//					if (key.isAcceptable()) {
//						// 有客户端连接请求时
//						junProtocol.handleAccept(key);
//					}
//
//					if (key.isReadable()) {
//						// 从客户端读取数据
//						junProtocol.handleRead(key);
//					}
//
//					if (key.isValid() && key.isWritable()) {
//						// 客户端可写时
//						junProtocol.handleWrite(key);
//					}
//				} catch (IOException ex) {
//					// 出现IO异常（如客户端断开连接）时移除处理过的键
//					keyIter.remove();
//					continue;
//				}
//
//				// 移除处理过的键
//				keyIter.remove();
//			}
//
//		}

	}

}
